﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Interfaces.Servicos;
using LM.InterfacesFabricas.Utilidades;
using LM.Negocio.Objetos;
using LM.Negocio.Validadores;
using LM.Repositorios;
using LM.Repositorios.Interfaces;

namespace LM.Servicos
{
    
    public class ServicoDeVeiculo : IServicoDeVeiculo
    {
        public void Cadastre(DtoVeiculo veiculo)
        {
            var repositorioDeVeiculo = FabricaDeRepositorios.Crie<IRepositorioDeVeiculo>();
            var validadorDeVeiculo = new ValidadorDeVeiculo(repositorioDeVeiculo);
            var veiculoObjeto = ConversorDeObjetos.Copie<Veiculo>(veiculo);

            validadorDeVeiculo.ValideCadastro(veiculoObjeto);

            repositorioDeVeiculo.Cadastre(veiculoObjeto);
        }

        public void Atualize(DtoVeiculo veiculo)
        {
            var repositorioDeVeiculo = FabricaDeRepositorios.Crie<IRepositorioDeVeiculo>();
            var validadorDeVeiculo = new ValidadorDeVeiculo(repositorioDeVeiculo);
            var veiculoObjeto = ConversorDeObjetos.Copie<Veiculo>(veiculo);

            validadorDeVeiculo.ValideAtualizacao(veiculoObjeto);

            repositorioDeVeiculo.Atualize(veiculoObjeto);
        }

        public void Exclua(int codigo)
        {
            var repositorioDeVeiculo = FabricaDeRepositorios.Crie<IRepositorioDeVeiculo>();
            var validadorDeVeiculo = new ValidadorDeVeiculo(repositorioDeVeiculo);
            var veiculoObjeto = ConversorDeObjetos.Copie<Veiculo>(repositorioDeVeiculo.Consulte(codigo));

            validadorDeVeiculo.ValideExclusao(veiculoObjeto);

            repositorioDeVeiculo.Exclua(veiculoObjeto);
        }

        public DtoVeiculo Consulte(int codigo)
        {
            var veiculoObjeto = FabricaDeRepositorios.Crie<IRepositorioDeVeiculo>().Consulte(codigo);

            return ConversorDeObjetos.Copie<DtoVeiculo>(veiculoObjeto);
        }

        public IList<DtoVeiculo> ConsulteTodos()
        {
            return ConversorDeObjetos.Copie<DtoVeiculo, Veiculo>(FabricaDeRepositorios.Crie<IRepositorioDeVeiculo>().ConsulteTodos());
        }
    }
}
